Site Map

coords = ctmax_data %>%
  inner_join(site_data, by = c("site", "lat", "collection_temp")) %>% 
  dplyr::select(site, long, lat, collection_temp, elevation) %>%
  drop_na(collection_temp) %>% 
  distinct()

map_data("world") %>% 
  filter(region %in% c("USA", "Canada")) %>% 
  ggplot() + 
  geom_polygon(aes(x = long, y = lat, group = group),
               fill = "grey92", colour = "grey40", linewidth = 0.1) + 
  coord_map(xlim = c(-110,-60),
            ylim = c(25, 55)) + 
  geom_point(data = coords,
             mapping = aes(x = long, y = lat, colour = elevation),
             size = 3) +
  scale_colour_viridis_c(option = "G", direction = -1) + 
  labs(x = "Longitude", 
       y = "Latitude",
       colour = "Elev. (m)") + 
  theme_matt() + 
  theme(legend.position = "right")

CTmax Data

temp_lat_plot = ctmax_data %>% 
  select(lat, collection_temp) %>% 
  distinct() %>% 
  ggplot(aes(x = lat, y = collection_temp)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(size = 3) + 
  labs(x = "Latitude", 
       y = "Collection Temp. (°C)") + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_temp_plot = ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = ctmax)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(aes(colour = species), 
             size = 3) + 
  labs(x = "Collection Temp. (°C)", 
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_lat_plot = ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = lat, y = ctmax)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(aes(colour = species), 
             size = 3) + 
  labs(x = "Latitude", 
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_elev_plot = ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = elevation, y = ctmax)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(aes(colour = species), 
             size = 3) +
  labs(x = "Elevation (m)", 
       y = "CTmax (°C)") +
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ggpubr::ggarrange(temp_lat_plot, ctmax_temp_plot, ctmax_lat_plot, ctmax_elev_plot, common.legend = T, legend = "right", nrow = 2, ncol = 2, labels = "AUTO")

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = ctmax, colour = species)) + 
  facet_wrap(species~.) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point() + 
  labs(x = "Collection Temp. (°C)",
       y = "CTmax (°C)") + 
  scale_color_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  filter(str_detect(species, pattern = "skisto") | 
           str_detect(species, pattern = "lepto") | 
           str_detect(species, pattern = "aglao")) %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  group_by(collection_date, species, collection_temp) %>% 
  summarise(mean_ctmax = mean(ctmax),
            ctmax_sd = sd(ctmax),
            ctmax_n = n(), 
            ctmax_se = ctmax_sd / sqrt(ctmax_n)) %>% 
  ggplot(aes(x = collection_temp, y = mean_ctmax, colour = species)) + 
  geom_smooth(method = "lm", se=F, linewidth = 2) + 
  geom_point(size = 2) + 
  geom_errorbar(aes(ymin = mean_ctmax - ctmax_se, 
                    ymax = mean_ctmax + ctmax_se),
                width = 0.3, linewidth = 1) + 
  labs(x = "Collection Temp. (°C)",
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = size, colour = species)) + 
  facet_wrap(species~.) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point() + 
  labs(x = "Collection Temp. (°C)",
       y = "Prosome Length (mm)") + 
  scale_color_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = egg_volume, colour = species)) + 
  facet_wrap(species~.) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point() + 
  labs(x = "Collection Temp. (°C)",
       y = "Egg Volume (mm^3)") + 
  scale_color_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  select(elevation, collection_temp) %>% 
  distinct() %>% 
  ggplot(aes(x = elevation, y = collection_temp)) + 
  geom_point(size = 3) +
  labs(x = "Elevation (m)", 
       y = "Collection Temp. (°C)") + 
  theme_matt()

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = size, y = ctmax, colour = species)) + 
  #facet_wrap(.~species) + 
  geom_point(size = 1) + 
  theme_matt() + 
  labs(x = "Length (mm)", 
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = size, y = fecundity, colour = species)) + 
  facet_wrap(.~species) + 
  geom_point(size = 1) + 
  theme_matt() + 
  labs(x = "Length (mm)", 
       y = "Fecundity (# eggs)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme(legend.position = "none")

ggplot(ctmax_data, aes(x = size, y = total_egg_volume)) + 
  geom_smooth(method = "lm", formula = y ~ exp(x)) + 
  geom_point()+
  labs(x = "Prosome Length (mm)",
       y = "Total Egg Volume (mm^3)") + 
  theme_matt()

Data for just Skistodiaptomus pallidus is shown below. Point color is arranged according to latitude.

ctmax_data %>% 
  filter(species == "skistodiaptomus_pallidus") %>%
  mutate(site = fct_reorder(site, lat, .desc = T)) %>% 
  # group_by(site) %>% 
  # summarise(size = mean(size, na.rm = T), 
  #          total_egg_volume = mean(total_egg_volume, na.rm = T)) %>% 
  ggplot(aes(x = size, y = total_egg_volume)) + 
  geom_smooth(method = "lm", formula = y ~ exp(x), 
              colour = "black") + 
  geom_point(aes(colour = site))+
  scale_color_viridis_d(direction = 1, 
                        option = "D") + 
  labs(x = "Prosome Length (mm)",
       y = "Total Egg Volume (mm^3)") + 
  theme_matt() + 
  theme(legend.position = "right")

model_data = ctmax_data %>% 
  mutate("genus" = str_split_fixed(species, pattern = "_", n = 2)[,1],
         genus = tools::toTitleCase(genus),
         "doy" = yday(collection_date)) %>% 
  select(site, collection_date, doy, collection_temp, lat, elevation, species, genus, sample_id, fecundity, total_egg_volume, size, ctmax) %>% 
  filter(genus != "MH") %>%  
  mutate(total_egg_volume = if_else(is.na(total_egg_volume), 0, total_egg_volume),
         collection_temp_sc = scale(collection_temp),
         lat_sc = scale(lat), 
         elevation_sc = scale(elevation),
         tev_sc = scale(total_egg_volume)) 

ctmax_overall.model = lm(data = model_data, 
                      ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume)

drop1(ctmax_overall.model, test = "F")
## Single term deletions
## 
## Model:
## ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume
##                  Df Sum of Sq    RSS     AIC  F value    Pr(>F)    
## <none>                        485.97  -4.365                       
## genus             2   138.079 624.04 117.677  70.6070 < 2.2e-16 ***
## collection_temp   1   105.341 591.31  92.519 107.7332 < 2.2e-16 ***
## lat               1   113.236 599.20  99.203 115.8076 < 2.2e-16 ***
## elevation         1     6.509 492.48   0.341   6.6572   0.01016 *  
## total_egg_volume  1    21.484 507.45  15.438  21.9722 3.578e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

#MuMIn::dredge(ctmax_temp.model)

performance::check_model(ctmax_overall.model)


summary(ctmax_overall.model)
## 
## Call:
## lm(formula = ctmax ~ genus + collection_temp + lat + elevation + 
##     total_egg_volume, data = model_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.9257 -0.4763  0.1481  0.6467  2.4003 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           4.305e+01  1.077e+00  39.993  < 2e-16 ***
## genusLeptodiaptomus  -2.803e+00  2.795e-01 -10.029  < 2e-16 ***
## genusSkistodiaptomus -1.512e+00  2.711e-01  -5.578 4.01e-08 ***
## collection_temp       1.613e-01  1.554e-02  10.379  < 2e-16 ***
## lat                  -2.093e-01  1.945e-02 -10.761  < 2e-16 ***
## elevation            -2.403e-04  9.313e-05  -2.580   0.0102 *  
## total_egg_volume      4.056e+01  8.653e+00   4.687 3.58e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9888 on 497 degrees of freedom
## Multiple R-squared:  0.5974, Adjusted R-squared:  0.5926 
## F-statistic: 122.9 on 6 and 497 DF,  p-value: < 2.2e-16

emmeans::emmeans(ctmax_overall.model, specs = "genus") %>% 
  data.frame() %>% 
  mutate(genus = fct_reorder(genus, .x = emmean, .desc = T)) %>% 
  ggplot(aes(genus, y = emmean)) + 
  geom_point(size = 4) + 
  geom_errorbar(aes(ymin = emmean - SE, ymax = emmean + SE), 
                width = 0.2, linewidth = 1) + 
  labs(x = "") + 
  theme_matt() + 
  theme(axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))


ctmax_temp.model = lm(data = model_data, 
                      ctmax ~ species * collection_temp)

drop1(ctmax_temp.model, 
      scope = ~.,
      test = "F")
## Single term deletions
## 
## Model:
## ctmax ~ species * collection_temp
##                         Df Sum of Sq    RSS     AIC F value    Pr(>F)    
## <none>                               325.08 -193.01                      
## species                  4   16.0254 341.10 -176.76  6.0389 9.487e-05 ***
## collection_temp          1    1.2044 326.28 -193.15  1.8155    0.1785    
## species:collection_temp  4    2.9632 328.04 -196.44  1.1166    0.3479    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

performance::check_model(ctmax_temp.model)


sp_means = emmeans::emmeans(ctmax_temp.model, "species") %>% 
  data.frame() %>% 
  drop_na() %>%  
  select(species, "ctmax" = emmean)

sp_plast = emmeans::emtrends(ctmax_temp.model, "species", var = "collection_temp") %>% 
  data.frame() %>% 
  drop_na() %>% 
  mutate(species = fct_reorder(species, .x = collection_temp.trend, .desc = T)) %>% 
  select(species, "plast" = collection_temp.trend)

sp_means %>% 
inner_join(sp_plast) %>% 
  mutate(species = fct_reorder(species, plast, .fun = min)) %>% 
  ggplot(aes(x = species, y = plast)) + 
  geom_hline(yintercept = 0) + 
  geom_bar(stat = "identity") + 
  theme_matt() + 
  theme(axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))

ctmax_data %>% 
  mutate(group_id = paste(site, species, collection_date)) %>% 
  ggplot(aes(x = fecundity, y = site, fill = site)) + 
  geom_density_ridges(bandwidth = 2,
                      jittered_points = TRUE, 
                      point_shape = 21,
                      point_size = 1,
                      point_colour = "grey30",
                      point_alpha = 0.6,
                      alpha = 0.9,
                      position = position_points_jitter(
                        height = 0.1, width = 0)) + 
  scale_fill_viridis_d(option = "D", direction = -1) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(group_id = paste(site, species, collection_date)) %>% 
  ggplot(aes(x = size, y = site, fill = site, group = group_id)) + 
  geom_density_ridges(bandwidth = 0.02,
                      jittered_points = TRUE, 
                      point_shape = 21,
                      point_size = 1,
                      point_colour = "grey30",
                      point_alpha = 0.6,
                      alpha = 0.9,
                      position = position_points_jitter(
                        height = 0.1, width = 0)) + 
  scale_fill_viridis_d(option = "D", direction = -1) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(group_id = paste(site, species, collection_date)) %>% 
  ggplot(aes(x = ctmax, y = site, fill = site, group = group_id)) + 
  geom_density_ridges(bandwidth = 0.3,
                      jittered_points = TRUE, 
                      point_shape = 21,
                      point_size = 1,
                      point_colour = "grey30",
                      point_alpha = 0.6,
                      alpha = 0.9,
                      position = position_points_jitter(
                        height = 0.1, width = 0)) + 
  scale_fill_viridis_d(option = "D", direction = -1) + 
  labs(x = "CTmax (°C)") + 
  theme_matt() + 
  theme(legend.position = "none")

F3 CTmax data

Skistodiaptomus pallidus was collected from three sites (Centennial Park - CO, Ochsner Pond - OH, and Center Springs Pond - CT) were reared in the lab at 16°C for at least three generations. CTmax was measured for these copepods to test for genetic variation in thermal limits in this widely distributed species.

Lab reared copepods varied in size, with Centennial Park individuals ~0.1 mm longer than those from Ochsner Pond.

ggplot(f3_data, aes(x = site, y = size)) + 
  geom_boxplot() + 
  labs(x = "Site", 
       y = "Prosome Length (mm)") + 
  theme_matt()

f3_size.model = lm(data = f3_data, 
              size~site)

# performance::check_model(f3_size.model)

# f3.model = lme4::lmer(data = f3_data, 
#                       ctmax~site + (1|experiment_date))

Upper thermal limit did not vary between the populations.

ggplot(f3_data, aes(x = site, y = ctmax)) + 
  geom_boxplot() + 
  labs(x = "Site", 
       y = "CTmax (°C)") + 
  theme_matt()

f3_ctmax.model = lm(data = f3_data, 
              ctmax~site)

# performance::check_model(f3_ctmax.model)

# f3.model = lme4::lmer(data = f3_data, 
#                       ctmax~site + (1|experiment_date))

Fecundity also appears to vary between populations, even after rearing in lab for several generations.

ggplot(f3_data, aes(x = site, y = fecundity)) + 
  geom_boxplot() + 
  labs(x = "Site", 
       y = "Clutch Size (eggs per female)") + 
  theme_matt()

f3_fecund.model = glm(data = f3_data, 
              fecundity~site,
              family="poisson")

# performance::check_model(f3_fecund.model)
# 
# car::Anova(f3_fecund.model)

# f3.model = lme4::lmer(data = f3_data, 
#                       ctmax~site + (1|experiment_date))

To summarize the initial findings, Centennial Park copepods had larger body sizes but smaller clutch sizes than copepods from Ochsner Pond. CTmax was similar between the two populations.

High throughput size measurements

scan_sizes %>% 
  filter(sex == "female", stage == "adult") %>% 
  ggplot(aes(x = length, fill = species)) + 
  facet_wrap(site~., nrow = 3) + 
  geom_histogram(binwidth = 0.01, colour = "grey10", linewidth = 0.25) + 
  scale_fill_manual(values = skisto_cols) + 
  theme_minimal(base_size = 20) + 
  theme(panel.grid = element_blank(),
        strip.text = element_text(face = "bold"),
        legend.position = "bottom")


scan_sizes %>% 
  filter(sex == "female", stage == "adult") %>%
  ggplot(aes(x = length, y = site, fill = species)) + 
  geom_density_ridges(bandwidth = 0.02,
                      jittered_points = TRUE,
                      position = position_points_jitter(yoffset = -0.15, width = 0, height = 0.1),
                      point_alpha = 0.3, point_colour = "grey30")  + 
  labs(y = "",
       x = "Prosome Length (mm)") + 
    scale_fill_manual(values = skisto_cols) + 
  theme_minimal(base_size = 20) + 
  theme(panel.grid = element_blank(),
        strip.text = element_text(face = "bold"),
        legend.position = "bottom")

scan_sizes %>% 
    filter(sex == "female", stage == "adult") %>%
    inner_join(site_data) %>% 
  ggplot(aes(x = collection_temp, y = length)) + 
  geom_point(position = position_jitter(width = 0.08, height = 0)) + 
  theme_matt()

COI Barcoding

knitr::include_graphics("../Figures/species_prop_plot.png")

knitr::include_graphics("../Figures/clade_prop_plot.png")

knitr::include_graphics("../Figures/tree_plot.png")

LS0tCnRpdGxlOiBEaWFwdG9taWQgVGhlcm1hbCBMaW1pdHMKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICAgIHRvYzogdHJ1ZQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZGVwdGg6IDMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1ULCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEYsIGVjaG8gPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IGtuaXRyOjppc19odG1sX291dHB1dCgpLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBkZXYgPSBjKCJwbmciLCAicGRmIiksCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBjb2xsYXBzZSA9IFQKKQoKdGhlbWVfbWF0dCA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgZGFya190ZXh0ID0gImdyZXkyMCIpewogIG1pZF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbMl0KICBsaWdodF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbM10KICAKICBnZ3B1YnI6OnRoZW1lX3B1YnIoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gZGFya190ZXh0KSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBtaWRfdGV4dCksCiAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDMsIDAsIDAsIDApLCAibW0iKSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDAsIDUsIDAsIDApLCAibW0iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IDkwKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT1iYXNlX3NpemUgKiAwLjkpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwKICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMC4yNSwgMC4yNSwgMC4yNSwgMC4yNSwiY20iKQogICAgKQp9Cgp0aGVtZV9tYXR0X2ZhY2V0cyA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcmtfdGV4dCA9ICJncmV5MjAiKXsKICBtaWRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzJdCiAgbGlnaHRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzNdCiAgCiAgdGhlbWVfYncoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMywgMCwgMCwgMCksICJtbSIpKSwKICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMCwgNSwgMCwgMCksICJtbSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gOTApLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPWJhc2Vfc2l6ZSAqIDAuOSksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMC45LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLAogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLjI1LCAwLjI1LCAwLjI1LCAwLjI1LCJjbSIpCiAgICApCn0KYGBgCgojIyBTaXRlIE1hcAoKYGBge3Igc2FtcGxlZC1zaXRlcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CmNvb3JkcyA9IGN0bWF4X2RhdGEgJT4lCiAgaW5uZXJfam9pbihzaXRlX2RhdGEsIGJ5ID0gYygic2l0ZSIsICJsYXQiLCAiY29sbGVjdGlvbl90ZW1wIikpICU+JSAKICBkcGx5cjo6c2VsZWN0KHNpdGUsIGxvbmcsIGxhdCwgY29sbGVjdGlvbl90ZW1wLCBlbGV2YXRpb24pICU+JQogIGRyb3BfbmEoY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKQoKbWFwX2RhdGEoIndvcmxkIikgJT4lIAogIGZpbHRlcihyZWdpb24gJWluJSBjKCJVU0EiLCAiQ2FuYWRhIikpICU+JSAKICBnZ3Bsb3QoKSArIAogIGdlb21fcG9seWdvbihhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyZXk5MiIsIGNvbG91ciA9ICJncmV5NDAiLCBsaW5ld2lkdGggPSAwLjEpICsgCiAgY29vcmRfbWFwKHhsaW0gPSBjKC0xMTAsLTYwKSwKICAgICAgICAgICAgeWxpbSA9IGMoMjUsIDU1KSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjb29yZHMsCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb25nLCB5ID0gbGF0LCBjb2xvdXIgPSBlbGV2YXRpb24pLAogICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19jKG9wdGlvbiA9ICJHIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsCiAgICAgICBjb2xvdXIgPSAiRWxldi4gKG0pIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCiMjIENUbWF4IERhdGEgCgpgYGB7ciBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTB9CnRlbXBfbGF0X3Bsb3QgPSBjdG1heF9kYXRhICU+JSAKICBzZWxlY3QobGF0LCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjb2xsZWN0aW9uX3RlbXApKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X3RlbXBfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcyksIAogICAgICAgICAgICAgc2l6ZSA9IDMpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2xhdF9wbG90ID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjdG1heCkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBzcGVjaWVzKSwgCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2VsZXZfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcyksIAogICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBsYWJzKHggPSAiRWxldmF0aW9uIChtKSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpnZ3B1YnI6OmdnYXJyYW5nZSh0ZW1wX2xhdF9wbG90LCBjdG1heF90ZW1wX3Bsb3QsIGN0bWF4X2xhdF9wbG90LCBjdG1heF9lbGV2X3Bsb3QsIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiLCBucm93ID0gMiwgbmNvbCA9IDIsIGxhYmVscyA9ICJBVVRPIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb2xsZWN0aW9uX3RlbXAsIHkgPSBjdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZmFjZXRfd3JhcChzcGVjaWVzfi4pICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIsCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQpjdG1heF9kYXRhICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gInNraXN0byIpIHwgCiAgICAgICAgICAgc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gImxlcHRvIikgfCAKICAgICAgICAgICBzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAiYWdsYW8iKSkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl9kYXRlLCBzcGVjaWVzLCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBzdW1tYXJpc2UobWVhbl9jdG1heCA9IG1lYW4oY3RtYXgpLAogICAgICAgICAgICBjdG1heF9zZCA9IHNkKGN0bWF4KSwKICAgICAgICAgICAgY3RtYXhfbiA9IG4oKSwgCiAgICAgICAgICAgIGN0bWF4X3NlID0gY3RtYXhfc2QgLyBzcXJ0KGN0bWF4X24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gbWVhbl9jdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RiwgbGluZXdpZHRoID0gMikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2N0bWF4IC0gY3RtYXhfc2UsIAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX2N0bWF4ICsgY3RtYXhfc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IHNpemUsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IGVnZ192b2x1bWUsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJFZ2cgVm9sdW1lIChtbV4zKSIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KY3RtYXhfZGF0YSAlPiUgCiAgc2VsZWN0KGVsZXZhdGlvbiwgY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY29sbGVjdGlvbl90ZW1wKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgbGFicyh4ID0gIkVsZXZhdGlvbiAobSkiLCAKICAgICAgIHkgPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gY3RtYXgsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogICNmYWNldF93cmFwKC5+c3BlY2llcykgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArIAogIHRoZW1lX21hdHQoKSArIAogIGxhYnMoeCA9ICJMZW5ndGggKG1tKSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gZmVjdW5kaXR5LCBjb2xvdXIgPSBzcGVjaWVzKSkgKyAKICBmYWNldF93cmFwKC5+c3BlY2llcykgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArIAogIHRoZW1lX21hdHQoKSArIAogIGxhYnMoeCA9ICJMZW5ndGggKG1tKSIsIAogICAgICAgeSA9ICJGZWN1bmRpdHkgKCMgZWdncykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoY3RtYXhfZGF0YSwgYWVzKHggPSBzaXplLCB5ID0gdG90YWxfZWdnX3ZvbHVtZSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBleHAoeCkpICsgCiAgZ2VvbV9wb2ludCgpKwogIGxhYnMoeCA9ICJQcm9zb21lIExlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiVG90YWwgRWdnIFZvbHVtZSAobW1eMykiKSArIAogIHRoZW1lX21hdHQoKQoKYGBgCgpEYXRhIGZvciBqdXN0ICpTa2lzdG9kaWFwdG9tdXMgcGFsbGlkdXMqIGlzIHNob3duIGJlbG93LiBQb2ludCBjb2xvciBpcyBhcnJhbmdlZCBhY2NvcmRpbmcgdG8gbGF0aXR1ZGUuIApgYGB7ciBmaWcud2lkdGg9OC41LCBmaWcuaGVpZ2h0PTUuNX0KY3RtYXhfZGF0YSAlPiUgCiAgZmlsdGVyKHNwZWNpZXMgPT0gInNraXN0b2RpYXB0b211c19wYWxsaWR1cyIpICU+JQogIG11dGF0ZShzaXRlID0gZmN0X3Jlb3JkZXIoc2l0ZSwgbGF0LCAuZGVzYyA9IFQpKSAlPiUgCiAgIyBncm91cF9ieShzaXRlKSAlPiUgCiAgIyBzdW1tYXJpc2Uoc2l6ZSA9IG1lYW4oc2l6ZSwgbmEucm0gPSBUKSwgCiAgIyAgICAgICAgICB0b3RhbF9lZ2dfdm9sdW1lID0gbWVhbih0b3RhbF9lZ2dfdm9sdW1lLCBuYS5ybSA9IFQpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc2l6ZSwgeSA9IHRvdGFsX2VnZ192b2x1bWUpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4gZXhwKHgpLCAKICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHNpdGUpKSsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2QoZGlyZWN0aW9uID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJEIikgKyAKICBsYWJzKHggPSAiUHJvc29tZSBMZW5ndGggKG1tKSIsCiAgICAgICB5ID0gIlRvdGFsIEVnZyBWb2x1bWUgKG1tXjMpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCgpgYGB7cn0KbW9kZWxfZGF0YSA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZSgiZ2VudXMiID0gc3RyX3NwbGl0X2ZpeGVkKHNwZWNpZXMsIHBhdHRlcm4gPSAiXyIsIG4gPSAyKVssMV0sCiAgICAgICAgIGdlbnVzID0gdG9vbHM6OnRvVGl0bGVDYXNlKGdlbnVzKSwKICAgICAgICAgImRveSIgPSB5ZGF5KGNvbGxlY3Rpb25fZGF0ZSkpICU+JSAKICBzZWxlY3Qoc2l0ZSwgY29sbGVjdGlvbl9kYXRlLCBkb3ksIGNvbGxlY3Rpb25fdGVtcCwgbGF0LCBlbGV2YXRpb24sIHNwZWNpZXMsIGdlbnVzLCBzYW1wbGVfaWQsIGZlY3VuZGl0eSwgdG90YWxfZWdnX3ZvbHVtZSwgc2l6ZSwgY3RtYXgpICU+JSAKICBmaWx0ZXIoZ2VudXMgIT0gIk1IIikgJT4lICAKICBtdXRhdGUodG90YWxfZWdnX3ZvbHVtZSA9IGlmX2Vsc2UoaXMubmEodG90YWxfZWdnX3ZvbHVtZSksIDAsIHRvdGFsX2VnZ192b2x1bWUpLAogICAgICAgICBjb2xsZWN0aW9uX3RlbXBfc2MgPSBzY2FsZShjb2xsZWN0aW9uX3RlbXApLAogICAgICAgICBsYXRfc2MgPSBzY2FsZShsYXQpLCAKICAgICAgICAgZWxldmF0aW9uX3NjID0gc2NhbGUoZWxldmF0aW9uKSwKICAgICAgICAgdGV2X3NjID0gc2NhbGUodG90YWxfZWdnX3ZvbHVtZSkpIAoKY3RtYXhfb3ZlcmFsbC5tb2RlbCA9IGxtKGRhdGEgPSBtb2RlbF9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgIGN0bWF4IH4gZ2VudXMgKyBjb2xsZWN0aW9uX3RlbXAgKyBsYXQgKyBlbGV2YXRpb24gKyB0b3RhbF9lZ2dfdm9sdW1lKQoKZHJvcDEoY3RtYXhfb3ZlcmFsbC5tb2RlbCwgdGVzdCA9ICJGIikKCiNNdU1Jbjo6ZHJlZGdlKGN0bWF4X3RlbXAubW9kZWwpCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoY3RtYXhfb3ZlcmFsbC5tb2RlbCkKCnN1bW1hcnkoY3RtYXhfb3ZlcmFsbC5tb2RlbCkKCmVtbWVhbnM6OmVtbWVhbnMoY3RtYXhfb3ZlcmFsbC5tb2RlbCwgc3BlY3MgPSAiZ2VudXMiKSAlPiUgCiAgZGF0YS5mcmFtZSgpICU+JSAKICBtdXRhdGUoZ2VudXMgPSBmY3RfcmVvcmRlcihnZW51cywgLnggPSBlbW1lYW4sIC5kZXNjID0gVCkpICU+JSAKICBnZ3Bsb3QoYWVzKGdlbnVzLCB5ID0gZW1tZWFuKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBlbW1lYW4gLSBTRSwgeW1heCA9IGVtbWVhbiArIFNFKSwgCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMiwgbGluZXdpZHRoID0gMSkgKyAKICBsYWJzKHggPSAiIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwMCwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSkpCmBgYAoKYGBge3J9CgpjdG1heF90ZW1wLm1vZGVsID0gbG0oZGF0YSA9IG1vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgY3RtYXggfiBzcGVjaWVzICogY29sbGVjdGlvbl90ZW1wKQoKZHJvcDEoY3RtYXhfdGVtcC5tb2RlbCwgCiAgICAgIHNjb3BlID0gfi4sCiAgICAgIHRlc3QgPSAiRiIpCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoY3RtYXhfdGVtcC5tb2RlbCkKCnNwX21lYW5zID0gZW1tZWFuczo6ZW1tZWFucyhjdG1heF90ZW1wLm1vZGVsLCAic3BlY2llcyIpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lIAogIGRyb3BfbmEoKSAlPiUgIAogIHNlbGVjdChzcGVjaWVzLCAiY3RtYXgiID0gZW1tZWFuKQoKc3BfcGxhc3QgPSBlbW1lYW5zOjplbXRyZW5kcyhjdG1heF90ZW1wLm1vZGVsLCAic3BlY2llcyIsIHZhciA9ICJjb2xsZWN0aW9uX3RlbXAiKSAlPiUgCiAgZGF0YS5mcmFtZSgpICU+JSAKICBkcm9wX25hKCkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gZmN0X3Jlb3JkZXIoc3BlY2llcywgLnggPSBjb2xsZWN0aW9uX3RlbXAudHJlbmQsIC5kZXNjID0gVCkpICU+JSAKICBzZWxlY3Qoc3BlY2llcywgInBsYXN0IiA9IGNvbGxlY3Rpb25fdGVtcC50cmVuZCkKCnNwX21lYW5zICU+JSAKaW5uZXJfam9pbihzcF9wbGFzdCkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gZmN0X3Jlb3JkZXIoc3BlY2llcywgcGxhc3QsIC5mdW4gPSBtaW4pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc3BlY2llcywgeSA9IHBsYXN0KSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAwLCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKYGBgCgoKCmBgYHtyIGZlY3VuZGl0eS1yaWRnZXMsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShncm91cF9pZCA9IHBhc3RlKHNpdGUsIHNwZWNpZXMsIGNvbGxlY3Rpb25fZGF0ZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmZWN1bmRpdHksIHkgPSBzaXRlLCBmaWxsID0gc2l0ZSkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhiYW5kd2lkdGggPSAyLAogICAgICAgICAgICAgICAgICAgICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb2xvdXIgPSAiZ3JleTMwIiwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMSwgd2lkdGggPSAwKSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7ciBzaXplLXJpZGdlcywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKGdyb3VwX2lkID0gcGFzdGUoc2l0ZSwgc3BlY2llcywgY29sbGVjdGlvbl9kYXRlKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHNpemUsIHkgPSBzaXRlLCBmaWxsID0gc2l0ZSwgZ3JvdXAgPSBncm91cF9pZCkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhiYW5kd2lkdGggPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb2xvdXIgPSAiZ3JleTMwIiwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMSwgd2lkdGggPSAwKSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7ciBjdG1heC1yaWRnZXMsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShncm91cF9pZCA9IHBhc3RlKHNpdGUsIHNwZWNpZXMsIGNvbGxlY3Rpb25fZGF0ZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjdG1heCwgeSA9IHNpdGUsIGZpbGwgPSBzaXRlLCBncm91cCA9IGdyb3VwX2lkKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDAuMywKICAgICAgICAgICAgICAgICAgICAgIGppdHRlcmVkX3BvaW50cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29sb3VyID0gImdyZXkzMCIsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC45LAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAwLjEsIHdpZHRoID0gMCkpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIkQiLCBkaXJlY3Rpb24gPSAtMSkgKyAKICBsYWJzKHggPSAiQ1RtYXggKMKwQykiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgojIyBGMyBDVG1heCBkYXRhIAoqU2tpc3RvZGlhcHRvbXVzIHBhbGxpZHVzKiB3YXMgY29sbGVjdGVkIGZyb20gdGhyZWUgc2l0ZXMgKENlbnRlbm5pYWwgUGFyayAtIENPLCBPY2hzbmVyIFBvbmQgLSBPSCwgYW5kIENlbnRlciBTcHJpbmdzIFBvbmQgLSBDVCkgd2VyZSByZWFyZWQgaW4gdGhlIGxhYiBhdCAxNsKwQyBmb3IgYXQgbGVhc3QgdGhyZWUgZ2VuZXJhdGlvbnMuIENUbWF4IHdhcyBtZWFzdXJlZCBmb3IgdGhlc2UgY29wZXBvZHMgdG8gdGVzdCBmb3IgZ2VuZXRpYyB2YXJpYXRpb24gaW4gdGhlcm1hbCBsaW1pdHMgaW4gdGhpcyB3aWRlbHkgZGlzdHJpYnV0ZWQgc3BlY2llcy4gCgpMYWIgcmVhcmVkIGNvcGVwb2RzIHZhcmllZCBpbiBzaXplLCB3aXRoIENlbnRlbm5pYWwgUGFyayBpbmRpdmlkdWFscyB+MC4xIG1tIGxvbmdlciB0aGFuIHRob3NlIGZyb20gT2Noc25lciBQb25kLiAKCmBgYHtyfQpnZ3Bsb3QoZjNfZGF0YSwgYWVzKHggPSBzaXRlLCB5ID0gc2l6ZSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBsYWJzKHggPSAiU2l0ZSIsIAogICAgICAgeSA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICB0aGVtZV9tYXR0KCkKYGBgCgpgYGB7cn0KZjNfc2l6ZS5tb2RlbCA9IGxtKGRhdGEgPSBmM19kYXRhLCAKICAgICAgICAgICAgICBzaXplfnNpdGUpCgojIHBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChmM19zaXplLm1vZGVsKQoKIyBmMy5tb2RlbCA9IGxtZTQ6OmxtZXIoZGF0YSA9IGYzX2RhdGEsIAojICAgICAgICAgICAgICAgICAgICAgICBjdG1heH5zaXRlICsgKDF8ZXhwZXJpbWVudF9kYXRlKSkKYGBgCgpVcHBlciB0aGVybWFsIGxpbWl0IGRpZCBub3QgdmFyeSBiZXR3ZWVuIHRoZSBwb3B1bGF0aW9ucy4gCgpgYGB7cn0KZ2dwbG90KGYzX2RhdGEsIGFlcyh4ID0gc2l0ZSwgeSA9IGN0bWF4KSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIGxhYnMoeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KCkKYGBgCgpgYGB7cn0KZjNfY3RtYXgubW9kZWwgPSBsbShkYXRhID0gZjNfZGF0YSwgCiAgICAgICAgICAgICAgY3RtYXh+c2l0ZSkKCiMgcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKGYzX2N0bWF4Lm1vZGVsKQoKIyBmMy5tb2RlbCA9IGxtZTQ6OmxtZXIoZGF0YSA9IGYzX2RhdGEsIAojICAgICAgICAgICAgICAgICAgICAgICBjdG1heH5zaXRlICsgKDF8ZXhwZXJpbWVudF9kYXRlKSkKYGBgCgpGZWN1bmRpdHkgYWxzbyBhcHBlYXJzIHRvIHZhcnkgYmV0d2VlbiBwb3B1bGF0aW9ucywgZXZlbiBhZnRlciByZWFyaW5nIGluIGxhYiBmb3Igc2V2ZXJhbCBnZW5lcmF0aW9ucy4gCmBgYHtyfQpnZ3Bsb3QoZjNfZGF0YSwgYWVzKHggPSBzaXRlLCB5ID0gZmVjdW5kaXR5KSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIGxhYnMoeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIkNsdXRjaCBTaXplIChlZ2dzIHBlciBmZW1hbGUpIikgKyAKICB0aGVtZV9tYXR0KCkKYGBgCgpgYGB7cn0KZjNfZmVjdW5kLm1vZGVsID0gZ2xtKGRhdGEgPSBmM19kYXRhLCAKICAgICAgICAgICAgICBmZWN1bmRpdHl+c2l0ZSwKICAgICAgICAgICAgICBmYW1pbHk9InBvaXNzb24iKQoKIyBwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoZjNfZmVjdW5kLm1vZGVsKQojIAojIGNhcjo6QW5vdmEoZjNfZmVjdW5kLm1vZGVsKQoKIyBmMy5tb2RlbCA9IGxtZTQ6OmxtZXIoZGF0YSA9IGYzX2RhdGEsIAojICAgICAgICAgICAgICAgICAgICAgICBjdG1heH5zaXRlICsgKDF8ZXhwZXJpbWVudF9kYXRlKSkKYGBgCgpUbyBzdW1tYXJpemUgdGhlIGluaXRpYWwgZmluZGluZ3MsIENlbnRlbm5pYWwgUGFyayBjb3BlcG9kcyBoYWQgbGFyZ2VyIGJvZHkgc2l6ZXMgYnV0IHNtYWxsZXIgY2x1dGNoIHNpemVzIHRoYW4gY29wZXBvZHMgZnJvbSBPY2hzbmVyIFBvbmQuIENUbWF4IHdhcyBzaW1pbGFyIGJldHdlZW4gdGhlIHR3byBwb3B1bGF0aW9ucy4gCgojIyBIaWdoIHRocm91Z2hwdXQgc2l6ZSBtZWFzdXJlbWVudHMgCgpgYGB7cn0Kc2Nhbl9zaXplcyAlPiUgCiAgZmlsdGVyKHNleCA9PSAiZmVtYWxlIiwgc3RhZ2UgPT0gImFkdWx0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IGxlbmd0aCwgZmlsbCA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc2l0ZX4uLCBucm93ID0gMykgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDEsIGNvbG91ciA9ICJncmV5MTAiLCBsaW5ld2lkdGggPSAwLjI1KSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMjApICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCmBgYHtyfQoKc2Nhbl9zaXplcyAlPiUgCiAgZmlsdGVyKHNleCA9PSAiZmVtYWxlIiwgc3RhZ2UgPT0gImFkdWx0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGVuZ3RoLCB5ID0gc2l0ZSwgZmlsbCA9IHNwZWNpZXMpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYmFuZHdpZHRoID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgIGppdHRlcmVkX3BvaW50cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoeW9mZnNldCA9IC0wLjE1LCB3aWR0aCA9IDAsIGhlaWdodCA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMywgcG9pbnRfY29sb3VyID0gImdyZXkzMCIpICArIAogIGxhYnMoeSA9ICIiLAogICAgICAgeCA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMjApICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQogIApgYGAKCmBgYHtyfQpzY2FuX3NpemVzICU+JSAKICAgIGZpbHRlcihzZXggPT0gImZlbWFsZSIsIHN0YWdlID09ICJhZHVsdCIpICU+JQogICAgaW5uZXJfam9pbihzaXRlX2RhdGEpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb2xsZWN0aW9uX3RlbXAsIHkgPSBsZW5ndGgpKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjA4LCBoZWlnaHQgPSAwKSkgKyAKICB0aGVtZV9tYXR0KCkKYGBgCgoKIyMgQ09JIEJhcmNvZGluZyAKCmBgYHtyLCBmaWcuYWxpZ249ImNlbnRlciJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIuLi9GaWd1cmVzL3NwZWNpZXNfcHJvcF9wbG90LnBuZyIpCmBgYAoKYGBge3IsIGZpZy5hbGlnbj0iY2VudGVyIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4uL0ZpZ3VyZXMvY2xhZGVfcHJvcF9wbG90LnBuZyIpCmBgYAoKYGBge3IsIGZpZy5hbGlnbj0iY2VudGVyIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4uL0ZpZ3VyZXMvdHJlZV9wbG90LnBuZyIpCmBgYAo=